import { _decorator, Component, Node, Button, Toggle, sys, EventHandler } from 'cc';
import { AudioManager } from '../core/AudioManager';

const { ccclass, property } = _decorator;

/**
 * 设置面板控制脚本
 * 负责处理设置面板上的各种UI交互
 */
@ccclass('SettingsPanel')
export class SettingsPanel extends Component {
    @property(Button)
    private closeButton: Button = null;
    
    @property(Toggle)
    private musicToggle: Toggle = null;
    
    @property(Toggle)
    private soundToggle: Toggle = null;
    
    // 本地存储键名
    private readonly MUSIC_ENABLED_KEY = 'music_enabled';
    private readonly SOUND_ENABLED_KEY = 'sound_enabled';
    
    // 生命周期方法
    onLoad() {
        this.initListeners();
        this.loadSettings();
    }
    
    onDestroy() {
        // 确保正常移除事件监听器
        try {
            this.removeListeners();
        } catch (error) {
            console.error('移除事件监听器时出错:', error);
        }
    }
    
    /**
     * 初始化事件监听
     */
    private initListeners(): void {
        // 关闭按钮点击事件
        if (this.closeButton && this.closeButton.node) {
            this.closeButton.node.on(Button.EventType.CLICK, this.onCloseButtonClick, this);
        } else {
            console.warn('关闭按钮未设置或无效');
        }
        
        // 音乐开关事件
        if (this.musicToggle && this.musicToggle.node) {
            this.musicToggle.node.on(Toggle.EventType.TOGGLE, this.onMusicToggleChange, this);
        } else {
            console.warn('音乐开关未设置或无效');
        }
        
        // 音效开关事件
        if (this.soundToggle && this.soundToggle.node) {
            this.soundToggle.node.on(Toggle.EventType.TOGGLE, this.onSoundToggleChange, this);
        } else {
            console.warn('音效开关未设置或无效');
        }
    }
    
    /**
     * 移除事件监听
     */
    private removeListeners(): void {
        if (this.closeButton && this.closeButton.node) {
            this.closeButton.node.off(Button.EventType.CLICK, this.onCloseButtonClick, this);
        }
        
        if (this.musicToggle && this.musicToggle.node) {
            this.musicToggle.node.off(Toggle.EventType.TOGGLE, this.onMusicToggleChange, this);
        }
        
        if (this.soundToggle && this.soundToggle.node) {
            this.soundToggle.node.off(Toggle.EventType.TOGGLE, this.onSoundToggleChange, this);
        }
    }
    
    /**
     * 加载设置
     */
    private loadSettings(): void {
        // 加载音乐设置
        const musicEnabled = this.getMusicEnabled();
        if (this.musicToggle) {
            this.musicToggle.isChecked = musicEnabled;
        }
        
        // 加载音效设置
        const soundEnabled = this.getSoundEnabled();
        if (this.soundToggle) {
            this.soundToggle.isChecked = soundEnabled;
        }
        
        // 应用设置到音频管理器
        this.applyAudioSettings();
    }
    
    /**
     * 应用音频设置
     */
    private applyAudioSettings(): void {
        const musicEnabled = this.getMusicEnabled();
        const soundEnabled = this.getSoundEnabled();
        
        // 如果有音频管理器，应用设置
        if (AudioManager.instance) {
            AudioManager.instance.setMusicEnabled(musicEnabled);
            AudioManager.instance.setSoundEnabled(soundEnabled);
        } else {
            console.warn('音频管理器不存在，无法应用音频设置');
        }
    }
    
    /**
     * 关闭按钮点击事件处理
     */
    private onCloseButtonClick(): void {
        // 关闭设置面板
        this.node.active = false;
    }
    
    /**
     * 音乐开关变化事件处理
     */
    private onMusicToggleChange(toggle: Toggle): void {
        const enabled = toggle.isChecked;
        
        // 保存设置
        this.setMusicEnabled(enabled);
        
        // 应用设置
        if (AudioManager.instance) {
            AudioManager.instance.setMusicEnabled(enabled);
            
            // 注意：不需要在这里播放音效，因为已经通过全局按钮点击事件处理了
        }
        
        console.log(`音乐已${enabled ? '开启' : '关闭'}`);
    }
    
    /**
     * 音效开关变化事件处理
     */
    private onSoundToggleChange(toggle: Toggle): void {
        const enabled = toggle.isChecked;
        
        // 保存设置
        this.setSoundEnabled(enabled);
        
        // 应用设置
        if (AudioManager.instance) {
            AudioManager.instance.setSoundEnabled(enabled);
            
            // 注意：不需要在这里播放音效，因为已经通过全局按钮点击事件处理了
        }
        
        console.log(`音效已${enabled ? '开启' : '关闭'}`);
    }
    
    /**
     * 获取音乐是否开启
     */
    private getMusicEnabled(): boolean {
        const value = sys.localStorage.getItem(this.MUSIC_ENABLED_KEY);
        return value === null ? true : value === 'true';
    }
    
    /**
     * 设置音乐是否开启
     */
    private setMusicEnabled(enabled: boolean): void {
        sys.localStorage.setItem(this.MUSIC_ENABLED_KEY, enabled.toString());
    }
    
    /**
     * 获取音效是否开启
     */
    private getSoundEnabled(): boolean {
        const value = sys.localStorage.getItem(this.SOUND_ENABLED_KEY);
        return value === null ? true : value === 'true';
    }
    
    /**
     * 设置音效是否开启
     */
    private setSoundEnabled(enabled: boolean): void {
        sys.localStorage.setItem(this.SOUND_ENABLED_KEY, enabled.toString());
    }
    
    /**
     * 显示设置面板
     */
    public show(): void {
        this.node.active = true;
    }
    
    /**
     * 隐藏设置面板
     */
    public hide(): void {
        this.node.active = false;
    }
} 